package br.org.acessobrasil.portal.action;

import java.util.List;

import org.apache.log4j.Logger;

import br.org.acessobrasil.portal.modelo.Perfil;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.PerfilDaoSpring;
import br.org.acessobrasil.portal.util.LoginInterceptor;

public class PerfilAction extends Super{
	private static Logger logger = Logger.getLogger(PerfilAction.class);
	private static final long serialVersionUID = 5415941766111935803L;
	private Perfil perfil;
	private static PerfilDaoSpring perfilDao;// = new PerfilDaoHib();
	private List<Perfil> listPerfil;
	
	public PerfilAction(PerfilDaoSpring pefilDaoSpring){
		perfilDao = pefilDaoSpring;
	}
	public String adicionarPerfil(){
		Usuario usuario = getUsuarioLogado();
		try {
			if (getPerfilUsuarioLogado().getNuHierarquia() >= perfil.getNuHierarquia()){
				usuario.addActionError("N&atilde;o � poss�vel criar um perfil com uma hierarquia maior que a atual.");
				return INPUT;
			}
			perfil.setSitio(getSitioAtual());
			perfilDao.create(perfil);
			usuario.addActionMessage("Perfil criado com sucesso.");
			perfil=null;
			setMensagemPerfil();
		} catch (Exception e) {
			logger.error("Erro ao criar perfil",e);
			usuario.addActionMessage("Erro: " + e.getMessage());
		}
		return SUCCESS;
	}
	
	public String listar() {
		if(getUsuarioLogado().getNuUsuario().equals(1l)){
			logger.debug("Listando todos os perfis para o root do sistema");
			setListPerfil(perfilDao.getList(-1,getSitioAtual()));
		}else{
			logger.debug("Listando perfis visiveis para nuHierarquia = " + getPerfilUsuarioLogado().getNuHierarquia() + " para usuario " + getUsuarioLogado().getNuUsuario());
			setListPerfil(perfilDao.getList(getPerfilUsuarioLogado().getNuHierarquia(),getSitioAtual()));
		}
		return SUCCESS;
	}
	
	public String carregarPerfil() {
		if (perfil != null && perfil.getNuPerfil() != 0) {
			try {
				perfil = perfilDao.select(perfil.getNuPerfil());
				//printPerfil(perfil);
				return SUCCESS;
			} catch (Exception e) {
				logger.error("Erro ao carregar perfil",e);
				return ERROR;
			}
		}
		return ERROR;
	}
	
	public String deletarPerfil(){
		Usuario usuario = getUsuarioLogado();
		try {
			if(btnCancelar!=null){
				return SUCCESS;
			}else{
				perfil = perfilDao.select(perfil.getNuPerfil());
				//ver se n�o existem usuarios com este perfil
				if(perfil.getListUsuario()==null || perfil.getListUsuario().size()==0){
					perfilDao.delete(perfil);
					usuario.addActionMessage("Perfil apagado com sucesso.");
				}else{
					usuario.addActionError("Existem usu&aacute;rios com este perfil, por isso n&atilde;o &eacute; poss&iacute;vel apag&aacute;-lo.");
					return INPUT;
				}
			}
		} catch (Exception e) {
			logger.error("Erro ao carregar perfil",e);
		}
		return SUCCESS;
	}
	
	public String setMensagemPerfil() {
		if (perfil==null){
			perfil= new Perfil(); 
			perfil.setNoPerfil(getText("predefinido.nome"));
			perfil.setDePerfil(getText("predefinido.descricao"));
			perfil.setNuHierarquia(10);
		}
		return SUCCESS;
	}
	
	public Perfil getPerfil() {
		return perfil;
	}
	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}
	public List<Perfil> getListPerfil() {
		if(listPerfil==null) {
			listPerfil=perfilDao.list(getSitioAtual());
		}
		return listPerfil;
	}
	public void setListPerfil(List<Perfil> listPerfil) {
		this.listPerfil = listPerfil;
	}
	public String atualizarPerfil() {
		Usuario usuario = getUsuarioLogado();
		try {
			Perfil perfilBanco = perfilDao.select(perfil.getNuPerfil());
			//so eh possivel criar hierarquia com numero maior, ou seja, com menos privilegios
			if(usuario.getPerfil().getNuHierarquia()<perfil.getNuHierarquia()){
				perfilBanco.setNoPerfil(perfil.getNoPerfil());
				perfilBanco.setNuHierarquia(perfil.getNuHierarquia());
				perfilBanco.setDePerfil(perfil.getDePerfil());
				perfilDao.update(perfilBanco);
				usuario.addActionMessage("Perfil atualizado com sucesso.");
				return SUCCESS;
			}else{
				usuario.addActionError("Erro ao atualizar o perfil.");
				usuario.addActionError("Escolha um n&uacute;mero para hierarquia maior do que " + usuario.getPerfil().getNuHierarquia());
				return INPUT;
			}
		} catch (Exception e) {
			usuario.addActionError("Erro ao atualizar o perfil.");
			logger.error("Erro ao atualizar o perfil.",e);
		}
		return INPUT;
	}
	
	public Perfil getPerfilUsuarioLogado() {
		return ((Usuario)getRequest().getSession().getAttribute(LoginInterceptor.USER_HANDLE)).getPerfil(); 
	}
}
